「電腦科學只有兩件難事:快取失效,和命名。」
這句話一般認為出自 Phil Karlton,但沒有人找得到確切的原始出處。Martin Fowler 整理過它的來歷:網路上找得到最早的紀錄,是 Tim Bray 2005 年的一篇部落格文章,Bray 後來補充,他大約在 1996、97 年就聽過這句話。來源不明,卻流傳了約三十年,因為每個寫過快取的工程師都知道它說的是真的。
快取本身不難。把算過的結果存起來,下次直接拿,省時又省力。難的是決定什麼時候該丟掉它。原始資料改了,快取不會知道,它會繼續把舊的結果交出去,看起來跟新的一模一樣。
語言模型對世界的認識,大致停在訓練資料截止的前後,一般認為越接近截止點,資料越稀疏,知道得越不完整。在那之後,工具改版、API 改名、參數換了意思,模型都不會知道。被問到時,它交出的是當時存下來的那一份,語氣跟回答任何問題一樣篤定。
Claude Code 本身就是很好的例子,它更新得很頻繁,幾個月之內很多東西就變了樣。
auto mode 讓一個分類模型代替人審核大部分的動作。從 v2.1.283 起,終端機和 VS Code 的互動 session 預設就以它起始;在那之前,只有部分方案是這樣。內建負責搜尋 codebase 的 Explore,是 Day 11 介紹過的那種 subagent,過去固定用比較小的 Haiku 模型,從 v2.1.198 起改成沿用主對話的模型,最高到 Opus。MCP 在 2026 年 7 月的新版規格裡,不再在協定層維持連線狀態,每個請求自己帶齊需要的資訊。
這些都不是冷門細節。一個在改版前訓練的模型被問到時,會給出當時正確、現在過時的答案,通常也不會附上「這可能已經變了」的提醒。Day 2 講過模型會自信地講錯;過期的知識是其中最難察覺的一種,因為它曾經是對的。
類比到這裡要轉個彎。資料庫的快取可以清掉,模型的知識卻不行,使用者沒辦法替它設有效期限,也沒辦法叫它忘掉某一段。這層快取,只能繞過。
真正能管的,是自己留下的那幾份複本:寫進 CLAUDE.md 的用法、存進記憶的設定、團隊 wiki 上的教學。它們跟模型的知識有一樣的毛病,寫下來的那一天是對的,之後就慢慢過期。快取失效的老方法,在這裡派得上用場。
最直接的是設有效期限。快取存進去時就註明能用多久,時間到了就重新取。放到 AI 協作上,就是任何會變動的資訊都帶上日期。CLAUDE.md 或記憶裡寫「這個 API 的 rate limit 是每秒兩次」,最好註明是哪一天查的,過了一段時間再用到,先回頭確認。
更徹底的做法,是乾脆不存複本,改成指向來源。快取會過期,是因為它是一份複本;不存複本,就沒有過期的問題。與其在 CLAUDE.md 抄下某個指令的完整用法,不如寫明「這類問題去查官方文件的哪一頁」。Day 9 說過,過時的記憶比沒有記憶更危險,因為 agent 會拿著它做錯,還做得很有把握。
模型那層快取,靠的是每次需要時直接去讀來源。
快取系統會用版本號判斷資料有沒有變,這裡也一樣:查任何工具的用法之前,先確認自己用的是哪一版。claude --version 一行指令就知道答案,而 Claude Code 的官方文件很多段落都會註明「需要哪個版本以上」,兩邊一對,就知道哪些說明適用。
接著去讀最新的文件。Claude Code 的 WebSearch 找到相關的網頁,WebFetch 把內容抓回來。問的是 Claude Code 本身的功能時,Claude 也可能把問題交給一個內建的 subagent,claude-code-guide,它用 Haiku 模型,專門回答 Claude Code 怎麼用的問題。Day 13 講過的 MCP,也有人做成專門提供各種函式庫最新文件的 server。
但讀來源這件事,本身也有它的快取和失真。
官方文件寫得很坦白:WebFetch 的設計就是有損的。多數情況下,它抓到網頁之後,會先交給另一個模型,依照指定的問題整理一次,Claude 拿到的是整理後的結果,不是原文。結果說「頁面沒有提到某件事」,可能只是問題沒有問到。需要逐字確認時,可以改用 curl 直接取得原始網頁。
WebFetch 也有自己的快取:同一個網址,預設十五分鐘內再抓,拿到的是先前那一份。用來對付過期資訊的工具,自己也帶著一層快取。
所以重要的資訊,最好不只看一個來源。官方文件、版本紀錄、實際跑一次指令,三者對得上,才比較放心。
Karlton 的那句話之所以流傳這麼久,是因為快取失效沒有一勞永逸的解法,只有不同的取捨:存久一點換速度,存短一點換正確。
AI 讓這個老問題換了一個位置。以前被快取起來的是資料庫的查詢結果,現在被快取起來的,是模型對整個世界的認識。這一份快取清不掉,也很少提醒人它舊了,能做的,是在關鍵的地方多回頭查一次來源。
延伸閱讀